package com.south.base.test.arithmetic;

import org.junit.Assert;
import org.junit.Test;

/**
 * @author Administrator
 * @date 2020/6/23 17:12
 */
public class NumOperation {
    /**
     * 各位相加
     * 给定一个非负整数 num，反复将各个位上的数字相加，直到结果为一位数。
     */
    @Test
    public void addDigits() {
        Assert.assertEquals(2, addDigits(38));
        Assert.assertEquals(1, addDigits(838));
    }

    public int addDigits(int num) {
        while (num / 10 > 0) {
            int a = 0;
            while (num > 0) {
                a += num % 10;
                num /= 10;
            }
            num = a;
        }
        return num;
    }

    /**
     * 丑数
     * 编写一个程序判断给定的数是否为丑数。
     * 丑数就是只包含质因数 2, 3, 5 的正整数。
     */
    @Test
    public void isUgly() {
        Assert.assertTrue(isUgly(6));
        Assert.assertTrue(isUgly(8));
        Assert.assertFalse(isUgly(14));
    }

    public boolean isUgly(int num) {
        if (num <= 0) {
            return false;
        }

        int[] factor = new int[]{2, 3, 5};
        for (int i : factor) {
            while (num % i == 0) {
                num = num / i;
            }
        }
        return num == 1;
    }

    /**
     * 有效的完全平方数
     * 给定一个正整数 num，编写一个函数，如果 num 是一个完全平方数，则返回 True，否则返回 False。
     */
    @Test
    public void isPerfectSquare() {
        Assert.assertTrue(isPerfectSquare(16));
        Assert.assertFalse(isPerfectSquare(14));
    }

    public boolean isPerfectSquare(int num) {
        if (num < 0) {
            return false;
        }
        if (num < 2) {
            return true;
        }
        long x = num / 2;
        while (x * x > num) {
            x = (x + num / x) / 2;
        }
        return (x * x == num);
    }
}
